home *** CD-ROM | disk | FTP | other *** search
- /*
- * some useful definitions for memory allocation and string
- * handling
- */
-
- #ifndef AUX_INCLUDED
- #define AUX_INCLUDED
-
- #define DOUBLEREAL 1
-
- #ifdef DOUBLEREAL
- typedef double real;
- #else
- typedef float real;
- #endif
-
- #define pi 3.141592654
- #define qval 1.602e-19
- #define sqrt0_75 0.866025403784
- #define sqrt3_0 1.732050807569
- #define efac (real)332.0636
- #define undef (real)9999.99
-
- typedef unsigned short Index;
- #define noIndex (Index)65535
-
- typedef unsigned char bool;
-
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdarg.h>
- #include <strings.h>
- #include <ctype.h>
- #include <math.h>
-
- #ifdef SUN
- #include <unistd.h>
- #endif
- #ifdef IRIS
- #include <bstring.h>
- #include <malloc.h>
- #include <limits.h>
- #endif
- /* #ifdef HP
- #include <string.h>
- #endif
- */
-
- #ifdef IRIS
- extern void *malloc(size_t);
- extern void *realloc(void *, size_t);
- extern void free(void *p);
- #define usleep(t) sginap((long)(((t)*CLK_TCK)/1000))
- #endif
-
- #ifdef NEXT
- #include <libc.h>
- #define HZ 60
- #endif
- #include <math.h>
-
- #ifndef MODNAME
- #define MODNAME "unknown"
- #endif
-
- #ifndef NOANSI
- #define assert(expr) if (!(expr)) error("%s: Assertion failed: "#expr".", MODNAME)
- #else
- #define assert(expr) if (!(expr)) error("%s: Assertion failed: expr.", MODNAME)
- #endif
-
- #define arr_debug(arr) { \
- debug(#arr": p=%x, len=%d, max=%d.\n",(arr).p, (arr).len, (arr).max); }
- #define DEB_NONE 0
- #define DEB_CPU 1
- #define DEB_REAL 2
- #define DEB_MEM 3
- #define DEB_ALL 4
-
- #define debug pdebug
- #define ndebug npdebug
-
- extern char *deb_pref;
- extern int deb_mode;
- extern void deb_print(char *s);
-
- #define DEB_EXIT 0
- #define DEB_CORE 1
- extern int deb_crash;
-
- #if PARIX
- #define bcopy(b1, b2, len) { register char *b_p1, *b_p2, *b_l; \
- for(b_p1=(char *)(b1), b_l=b_p1+len, b_p2=(char *)(b2); b_p1<b_l;) \
- *(b_p2++)=*(b_p1++); }
- #define bzero(b1, len) { register char *b_p1, *b_l; \
- for(b_p1=(char *)(b1), b_l=b_p1+len; b_p1<b_l;) \
- *(b_p1++)='\0'; }
- extern char *rindex(char *s, char c);
- #else
- #ifdef SUN
- extern void vprintf();
- extern void vsprintf();
- extern void bcopy();
- extern void bzero();
- extern int _filbuf(); /* God knows why these are not in /usr/include or /usr/5include */
- #endif
- #endif
-
- #define flags_set(flags, mask) flags |= (mask)
- #define flags_clear(flags, mask) flags &= ~(mask)
- #define flags_off(flags, mask) (!(flags&(mask)))
- #define flags_on(flags, mask) ((flags&(mask))==(mask))
-
- #define max(a, b) ((a) > (b) ? (a) : (b))
- #define min(a, b) ((a) < (b) ? (a) : (b))
-
- #define memory(str) if (memory_flag) { \
- mddebug("Memory used in %s, %s: %d.\n", MODNAME, str, memsize()); }
-
- #define arr_min 4
- #define arr_inc 4
-
-
- #define array(typ) struct { typ *p; int len, max; }
- #define sarray(typ) struct { typ *p; short unsigned len, max; }
- #define arr_init(arr) { (arr).p=0; (arr).max=0; (arr).len=0; }
- #define arr_empty(arr) { (arr).len=0; }
-
- #ifndef NOANSI
- #define arr_debug(arr) { \
- debug(#arr": p=%x, len=%d, max=%d.\n",(arr).p, (arr).len, (arr).max); }
- #define arr_printf(arr) #arr"[%d/%d](%x)",(arr).len,(arr).max,(arr).p
- #define arr_alloc(arr, ind) { register int a_n=ind+1; \
- if (!(arr).p) (arr).p = (void *)malloc(a_n*sizeof(*(arr).p)); \
- else if (a_n!=(arr).max) (arr).p = (void *)realloc((arr).p, a_n*sizeof(*(arr).p)); \
- if (!(arr).p) { perror("array"); error("Could not allocate "#arr" at "#ind"=%d.\n", (ind)); } \
- mem_size+=(a_n-(arr).max)*sizeof(*(arr).p); \
- /* for (a_n=(arr).max; a_n<=ind; a_n++) (arr).p[a_n]=0; */ (arr).max=(ind)+1; }
- #define arr_dim(arr, siz) { register int a_i=(siz); \
- if ((!(arr).p && (arr).max) || ((arr).p && !(arr).max)) \
- error("Illegal array "#arr": p=%x, max=%d, len=%d.\n", (arr).p, (arr).max, (arr).len); \
- if (!a_i) arr_empty(arr) else {if ((a_i--)>(arr).max) arr_alloc(arr, a_i) (arr).len=a_i+1; }}
- #define arr_check(arr, ind) { register int a_i, a_ind=(ind); \
- if ((!(arr).p && (arr).max) || ((arr).p && !(arr).max)) \
- error("Illegal array "#arr": p=%x, max=%d, len=%d.\n", (arr).p, (arr).max, (arr).len); \
- if (a_ind>=(arr).max) { \
- for (a_i=(arr).max; a_ind>=a_i; a_i+=(a_i/arr_inc+1)); \
- arr_alloc(arr, a_i); }}
- #else
- #define arr_debug(arr) { \
- debug("arr: p=%x, len=%d, max=%d.\n",(arr).p, (arr).len, (arr).max); }
- #define arr_printf(arr) "arr[%d/%d](%x)",(arr).len,(arr).max,(arr).p
- #define arr_alloc(arr, ind) { register int a_n=ind+1; \
- if (!(arr).p) (arr).p = (void *)malloc(a_n*sizeof(*(arr).p)); \
- else if (a_n!=(arr).max) (arr).p = (void *)realloc((arr).p, a_n*sizeof(*(arr).p)); \
- if (!(arr).p) { perror("array"); error("Could not allocate arr at ind=%d.\n", ind); } \
- mem_size+=(a_n-(arr).max)*sizeof(*(arr).p); \
- /* for (a_n=(arr).max; a_n<=ind; a_n++) (arr).p[a_n]=0; */ (arr).max=(ind)+1; }
- #define arr_dim(arr, siz) { register int a_i=(siz); \
- if ((!(arr).p && (arr).max) || ((arr).p && !(arr).max)) \
- error("Illegal array arr: p=%x, max=%d, len=%d.\n", (arr).p, (arr).max, (arr).len); \
- if (!a_i) arr_empty(arr) else {if ((a_i--)>(arr).max) arr_alloc(arr, a_i) (arr).len=a_i+1; }}
- #define arr_check(arr, ind) { register int a_i, a_ind=(ind); \
- if ((!(arr).p && (arr).max) || ((arr).p && !(arr).max)) \
- error("Illegal array arr: p=%x, max=%d, len=%d.\n", (arr).p, (arr).max, (arr).len); \
- if (a_ind>=(arr).max) { \
- for (a_i=(arr).max; a_ind>=a_i; a_i+=(a_i/arr_inc+1)); \
- arr_alloc(arr, a_i); }}
- #endif
-
- #define arr_copy(arr1, arr2) { \
- arr_init(arr1); \
- arr_dim(arr1, (arr2).len); \
- bcopy((char *)(arr2).p, (char *)(arr1).p, sizeof(*(arr2).p)*(arr2).len); }
-
- #define arr_add(arr, elem) { arr_check(arr, (arr).len); (arr).p[(arr).len++]=(elem); }
- #define arr_add2(arr, arr2, elem) { arr_check(arr2, (arr).len-1); \
- (arr2).p[(arr).len-1]=(elem); (arr2).len=(arr).len; }
- #define arr_free(arr) { \
- if ((arr).p) { free((arr).p); mem_size-=(arr).max*sizeof(*(arr).p); } \
- (arr).p=0; (arr).max=0; (arr).len=0; }
- #define arr_lfree(arr) { int a_i; \
- for (a_i=0; a_i<(arr).len; a_i++) cfree((arr).p[a_i]); \
- if ((arr).p) { free((arr).p); mem_size-=(arr).max*sizeof(*(arr).p)); } \
- (arr).p=0; (arr).max=0; (arr).len=0; }
-
- #define blank(chr) ((chr)==' ' || (chr)=='\t' || (chr)=='\n')
-
- extern int mem_size;
-
- #ifndef NOANSI
- #define m_alloc(ptr,num,typ) { int a_n=(num); \
- if (a_n) ptr = (typ *)malloc(a_n*sizeof(typ)); else ptr=NULL; \
- mem_size+=a_n*sizeof(typ); if (ptr==NULL && a_n) \
- error("Could not allocate ("#typ")"#ptr"["#num"=%d]", a_n); \
- }
- #define mfree(ptr, num, typ) { typ *a_p=NULL; int a_n=(num); \
- if (ptr==a_p && a_n) error("Cannot free ("#typ")"#ptr"["#num"=%d]", a_n); \
- if (a_n) free(ptr); ptr=NULL; mem_size-=a_n*sizeof(typ); \
- }
- #define mfree_o(ptr, ofs, num, typ) { typ *a_p=NULL; int a_n=(num); \
- if (ptr==a_p && a_n) error("Cannot free ("#typ")"#ptr"["#num"=%d]", a_n); \
- if (a_n) free(ptr+(ofs)); ptr=NULL; mem_size-=a_n*sizeof(typ); \
- }
- #define mext(ptr, num, num2, typ) { typ *a_p=NULL; int a_n1=(num), a_n2=(num2); \
- if (ptr==a_p && a_n1) \
- error("Cannot extend NULL ("#typ")"#ptr"["#num"=%d, "#num2"=%d]", a_n1, a_n2); \
- if (a_n1 && a_n2) ptr = (typ *)realloc((char*)ptr, a_n2*sizeof(typ)); \
- else if (a_n2) ptr = (typ *)malloc(a_n2*sizeof(typ)); else { free(ptr); ptr=NULL; } \
- if (ptr==NULL && a_n2) \
- error("Could not extend ("#typ")"#ptr"["#num"=%d, "#num2"=%d]", a_n1, a_n2); \
- mem_size+=(a_n2-a_n1)*sizeof(typ); \
- }
- #else
- #define m_alloc(ptr, num, typ) { int a_n=(num); \
- if (a_n) ptr = (typ *)malloc(a_n*sizeof(typ)); else ptr=NULL; \
- mem_size+=a_n*sizeof(typ); if (ptr==NULL && a_n) \
- error("Could not allocate (typ)ptr[num=%d]", a_n); \
- }
- #define mfree(ptr, num, typ) { typ *a_p=NULL; int a_n=(num); \
- if (ptr==a_p && a_n) error("Cannot free (typ)ptr[num=%d]", a_n); \
- if (a_n) free(ptr); ptr=NULL; mem_size-=a_n*sizeof(typ); \
- }
- #define mfree_o(ptr, ofs, num, typ) { typ *a_p=NULL; int a_n=(num); \
- if (ptr==a_p && a_n) error("Cannot free (typ)ptr[num=%d]", a_n); \
- if (a_n) free(ptr+(ofs)); ptr=NULL; mem_size-=a_n*sizeof(typ); \
- }
- #define mext(ptr, num, num2, typ) { typ *a_p=NULL; int a_n1=(num), a_n2=(num2); \
- if (ptr==a_p && a_n1) \
- error("Cannot extend NULL (typ)ptr[num=%d, num2=%d]", a_n1, a_n2); \
- if (a_n1 && a_n2) ptr = (typ *)realloc((char*)ptr, a_n2*sizeof(typ)); \
- else if (a_n2) ptr = (typ *)malloc(a_n2*sizeof(typ)); else { free(ptr); ptr=NULL; } \
- if (ptr==NULL && a_n2) \
- error("Could not extend (typ)ptr[num=%d, num2=%d]", a_n1, a_n2); \
- mem_size+=(a_n2-a_n1)*sizeof(typ); \
- }
- #endif
- #define m_allocz(ptr,num,typ) { int z_n=(num); \
- m_alloc(ptr, z_n, typ); \
- bzero((char *)ptr, (z_n)*sizeof(typ)); }
-
- #define mat_alloc(ptr, nx, ny, typ) { int m_i, m_x=(nx), m_y=(ny); typ **m_p; \
- m_alloc(m_p, m_x, typ *); m_alloc(m_p[0], m_x*m_y, typ); \
- for (m_i=1; m_i<m_x; m_i++) m_p[m_i] = m_p[m_i-1] + m_y; \
- ptr = m_p;}
- #define mat_ext(ptr, nxo, nyo, nx, ny, typ) { \
- int m_i, m_x=(nx), m_y=(ny), m_xo=(nxo), m_yo=(nyo); typ **m_p=(ptr); \
- mext(m_p, m_xo, m_x, typ *); mext(m_p[0], m_xo*m_yo, m_x*m_y, typ); \
- for (m_i=1; m_i<m_x; m_i++) m_p[m_i] = m_p[m_i-1] + m_y; \
- ptr = m_p;}
- #define mat_free(ptr, nx, ny, typ) { int m_x=(nx), m_y=(ny); \
- mfree((ptr)[0], m_x*m_y, typ); mfree(ptr, m_x, typ *); }
-
-
- #define aux_bufsiz 4098
-
- extern char aux_buf[], aux_buf2[], *aux_bufp;
-
- #define aux_bufstring(p) { unsigned l; \
- p = aux_bufp; aux_bufp += (l=strlen(aux_buf))+1; \
- if (aux_bufp>= aux_buf2+aux_bufsiz || aux_bufp < aux_buf2) \
- { p=aux_buf2; aux_bufp=p+l+1; } \
- strcpy(p, aux_buf); }
-
- #define aux_bufnstring(p, n) { unsigned l=(n); \
- p = aux_bufp; aux_bufp += l; \
- if (aux_bufp>= aux_buf2+aux_bufsiz || aux_bufp < aux_buf2) \
- { p=aux_buf2; aux_bufp=p+l; } \
- bcopy(aux_buf, p, l); }
-
- #define aux_sprintf(p, format) { va_list ap; \
- va_start(ap, format); \
- vsprintf(aux_buf, format, ap); \
- va_end(ap); \
- aux_bufstring(p); }
-
-
- #define check(ptr,num,defnum,typ) \
- ptr = (typ *)checkalloc((char *)ptr,(num)*sizeof(typ),(defnum)*sizeof(typ))
- #define newstring(ptr,defnum) { ptr=NULL; check(ptr,1,defnum,char); ptr[0]='\0'; }
- #define cfree(ptr) if (ptr!=NULL) { free(ptr); ptr=NULL; }
- #define lfree(ptr) { int i; if (ptr!=NULL) for(i=0;ptr[i]!=NULL;i++) cfree(ptr[i]); }
- #define nfree(ptr,n) { int i; if (ptr!=NULL) for(i=0;i<n;i++) cfree(ptr[i]); }
- #define ncopy(ptr,len,typ) (typ *)copydata((char *)ptr,(len)*sizeof(typ))
-
- extern int debug_flag;
- extern int memory_flag;
-
- extern real realtime();
- extern real cputime();
-
- extern void warning(char *format, ...);
- extern void error(char *format, ...);
- extern void pdebug(char *format, ...);
- extern void npdebug(char *format, ...);
-
- extern int memsize();
- extern char *checkalloc(); /* (char *p,int len,int deflen); */
- extern char *copy(); /* (const char *str); */
- extern char *stringf(char *format, ...);
- extern char *substr(const char *str, int ofs, int len);
- extern char *copydata(); /* (const char *str,int len); */
- extern char *append(); /* (char *s1,const char *s2); */
- extern FILE *ropen(); /* (const char *fn); */
- extern FILE *wopen(); /* (const char *fn); */
-
- extern void time_init(void);
- extern void time_start(char *s);
- extern void time_seq(char *s);
- extern void time_stop(char *s);
- extern void time_reset(char *str);
- extern real time_val(char *str);
- extern real time_lap(char *str);
- extern char *time_string_lap(char *str);
- extern void time_print(void);
-
- extern real ran_real(void);
-
- extern char *s_lst(int* p, int len);
-
- #endif
-